約 3,613,053 件
https://w.atwiki.jp/bambooflow/pages/55.html
ODEのインストール ここではLinux環境へのインストール方法を簡単に説明する。 odeをインストールする前にあらかじめ、OpenGL環境が入っていることをが必要みたい。 適当にいれたので参考にならないかもしれないけど、インストールした手順はここにメモっておく。 File ode-src-0.7.zipをダウンロードしたら $ unzip ode-src-0.7.zip $ cd ode-0.7 $ ./configure デフォルトでは/usr/localへインストールされる。 /usrへ変更する場合は、 $ ./configure --prefix=/usr と指定する。 $ make # make install 以下のものがインストールされたはず /usr/local/lib/libode.a /usr/local/lib/libode.so /usr/local/include/ode ldconfig error while loading shared libraries libode.so cannot open shared object file No such file or directory こんな、エラーが出るときは、自分で作成したサンプルをじっこうする際にlibode.soの場所を知らせないといけないみたいなので、/etc/ld.so.confを編集する。 -- ld.so.confファイル内 -- ・・・ /usr/local/lib # - 最後の行に追加 ------------------------- # /sbin/ldconfig で設定を反映させる。 drawstuff ode-v0.6の場合は、以下の作業が必要かも。 ここで、グラフィック表示するためのdrawstuffライブラリはインストールされない。 drawstuffを利用するため、手作業で以下のようにコピーした。 $ cp drawstuff/src/libdrawstuff.a lib 自分で作成したプログラムのメイク時には ode-0.6/include/ ... drawstuff ode-0.6/lib/ ... libdrawstuff.a を指定することが必要。 あと、example内のサンプルを実行しようとすると、インストールしたにもかかわらずライブラリが見つかりません、と怒られるかもしれない。 その場合は、libdrawstuff.aが見つからないためだろう。 そういうときは実行ファイルと同じディレクトリにコピーするなり、lib/とかにコピーするとかしないとだめみたい。
https://w.atwiki.jp/wendyz/pages/15.html
公式サイト http //ode.org/ 概要 オープンソースの3次元剛体動力学シミュレーターライブラリ コンポーネントとして動力学演算部分と衝突検出演算部分から構成されている。流体シミュレーション・布シミュレーション・軟体の表現はサポートされていない。 描画機能 簡易描画ライブラリとしてOpenGLをベースに作られたdrawstuffが付属してる。これは実行結果を簡易的に描画するのが目的でありODE自体の一部ではないので、drawstuffでの描画を行わずに演算結果の数値のみを取りだす事も可能である。 間接的にDirectXを利用して描画する事も出来る。ODEにIrrlicht EngineやOGREなどの3次元レンダリングエンジンを組み合わせた物も存在する。 ODEの特徴 オープンソースでライセンスはGNUのLGPLとBSDとなり自分の好きな方のライセンス 3次元グラフィクス(Open GL)と衝突検出機構が組み込まれている。 マニュアルがしっかりしているらしい。 制度は高くないが学会でも多くの使われる程度には有名らしい。 マルチプラットフォーム 汎用言語(C/C++)で開発可能。
https://w.atwiki.jp/bambooflow/pages/42.html
はじめの一歩 はじめの一歩コンパイル 実行 説明 プラス まとめ 全ソースコード ODEのインストールが完了したら、早速実行してみよう。 まずは、立方体を表示するプログラム hajime_v02.tgzファイルをダウンロードしてください。 ODEバージョンv0.11で確認。 コンパイル メイク時にライブラリの指定する必要があるため、指定の場所に展開する必要があります。 $ cd ode-0.11 $ tar xvzf hajime_v02.tgz $ make 特に、問題がなければこれでrun.xという実行ファイルが作成されるはず。 実行 作成された実行ファイルを実行してみて。 $ ./run.x 画面上でマウスを操作することで視点の切替えができます。 左ボタン ... 視点の方向変更 右ボタン ... xy方向の位置変更 中ボタン ... 高さ方向の位置変更 また、Ctrlキーを使っての操作も紹介しておきます。 Ctrl-P シミュレーションの一時停止(simLoopの引数pauseが変化する) Ctrl-O 一時停止時に1ステップごとに進める Ctrl-T テクスチャあり/なし(デフォルトではあり、なしにすると高速) Ctrl-S 影あり/なし Ctrl-V カメラ情報表示(x,y,z,h,p,r). Ctrl-W ppmファイル取得(frame/frameNNN.ppm)、ただしあらかじめframeディレクトリを作成しておく Ctrl-X 終了 説明 このプログラムは世界を作成して、ただ単に立方体を表示させるだけのプログラムになっています。 簡単にこのプログラムの流れを説明すると、 ODE初期化処理 世界(world)を生成する 世界に剛体を生成する剛体の設定(ここでは位置を決めている) シミュレーション実行(simLoop関数をループ) ってかんじです。 ODEの初期化は、 dInitODE(); で行います。他にも、dInitODE2(0);とかあるようです。 世界の生成は, world = dWorldCreate(); で行っています。生成した世界番号がworldに保持されます。 world変数は世界IDを保持する特別な変数で、 static dWorldID world; で宣言を行っています。 生成した世界に剛体を作成するために次を行います。 box = dBodyCreate( world ); 引数として世界IDであるworldを渡してあげてどの世界に生成するかを教える必要があります。 また、生成した剛体番号を保持するためにbox変数を次のように宣言しています。 static dBodyID box; 剛体を生成した後、dBodySetPositionで位置を指定します。 dBodyCreateで剛体を生成する前に指定した場合は、エラーとなります。 そして、次でシミュレーションを実行します。(無限ループ) dsSimulationLoop( argc, argv, 320, 240, fn ); このとき、第1第2引数としてargc,argvを渡しています。 実行時に引数を使用することで、テクスチャや影をあらかじめ消した状態で実行が可能となります。 テクスチャなし | -notex 影なし | -noshadow また、第3第4引数でウィンドウのサイズ設定を行います。 第5引数はdsFunctions構造体のアドレスを渡します。 dsFunctions fn; fn.version = DS_VERSION; fn.start = start; fn.step = simLoop; fn.command = 0; fn.stop = 0; fn.path_to_textures = "../drawstuff/textures"; dsFunctionsではイニシャライズ関数、シミュレーションループ関数やコマンドを受け付ける関数の指定を行います。 ここでは、シミュレーション開始時に実行する関数をstart()、シミュレーションループ関数としてsimLoop()を指定しています。 dsSimulationLoop実行後、始めにstart()関数を実行しています。 そのあと、simLoop()関数を実行(無限ループ)することになります。 start()関数内の22行目のdsSetViewpoint(xyz,hpr)ではグラフィック表示でのカメラ位置を指定しています。 第1引数でカメラ位置を設定し、第2引数でカメラの方向方位を設定します。 シミュレーションのメインループにあたるsimLoop()関数では、シミュレーションの進行と剛体の表示を行っています。 dWorldStep( world, 0.01 ); これはシミュレーションを進めます。 この関数が実行されるたびに第2引数で指定される数値だけシミュレーション時間が進行します。ここでは、1ステップで0.01進行します。単位は決まっていませんが、0.01秒と考えると良いでしょう。(おそらくSI単位系) dsSetColor( 1, 1, 0 ); // RGB Color dsDrawBox( dBodyGetPosition( box ), dBodyGetRotation( box ), box_sizes ); ここで、剛体をグラフィック表示させています。 剛体の色をdsSetColorで指定し、その次に呼ばれるdraw関数に適用されます。 dsDrawBoxでは、指定された位置と方位で箱を表示させます。 剛体の位置はdBodyGetPosition()関数で取得して、 剛体の方位はdBodyGetRotation()関数で取得します。 以上が簡単な流れになります。 プラス //dWorldSetGravity( world, 0.0, 0.0, -9.8 ); ↑ コメントアウトをはずして、再度コンパイルして実行してみて下さい。 すると、今度は剛体が落下していくのがわかると思います。 ここでは、世界に重力を設定しています。 しかし、今度は剛体がどこまでも落下していくと思います。これは、まだ衝突に関するプログラムを記述していないためです。衝突に関する記述は少し複雑になりますが、決まった記述方法なので慣れればそんなに難しくないと思います。 まとめ 今回のプログラムは、物体を世界に生成するプログラムを紹介しました。 他のプログラムも基本的な構造はあまり変わらないのでこの構造や流れを掴んでおけば他のやつも理解しやすいと思います。 また、今回のプログラムでは、剛体に形を指定していません。 グラフィック表示では箱になっていますが、別にこれは球体(Sphere)を指定しても問題ありません。 世界では、位置や質量などについて表現できますが、形状や衝突に関することは表現できません。 物体同士を衝突させる場合には、力学的世界(geom)が必要になってきます。 全ソースコード /*********************************************************** * Hajime no Ippo --- file hjime.cpp ***********************************************************/ #include ode/ode.h #include drawstuff/drawstuff.h static dWorldID world; // 世界ID static dBodyID box; // 剛体ID dReal box_sizes[3] = { 1.0, 1.0, 1.0 }; // 剛体のサイズ #ifdef dDOUBLE #define dsDrawBox dsDrawBoxD #endif // start simulation - set viewpoint static void start() { static float xyz[3] = { 0.f, 5.f, 3.f }; static float hpr[3] = { -90.f, -15.f, 0.f }; dsSetViewpoint( xyz, hpr ); // カメラ位置と方向設定 } // simulation loop static void simLoop( int pause ) { // Ctl+p が押されたらifに入らない if (!pause) { dWorldStep( world, 0.01 ); // 世界を進める } // 剛体の表示 dsSetColor( 1.0f, 1.0f, 0.0f ); // RGB Color dsDrawBox( dBodyGetPosition( box ), dBodyGetRotation( box ), box_sizes ); } int main( int argc, char* argv[] ) { dInitODE(); // setup pointers to drawstuff callback functions dsFunctions fn; fn.version = DS_VERSION; fn.start = start; fn.step = simLoop; fn.command = 0; fn.stop = 0; fn.path_to_textures = "../drawstuff/textures"; world = dWorldCreate(); // 世界生成 //dWorldSetGravity( world, 0.0, 0.0, -9.8 ); // 世界に重力を生成(z方向に-9.8m/s/s) box = dBodyCreate( world ); // 世界に剛体を作成 dReal pos[3] = { 0.0, 0.0, 3.0 }; dBodySetPosition( box, pos[0], pos[1], pos[2] ); // 剛体の位置を設定 dsSimulationLoop( argc, argv, 320, 240, fn ); // シミュレーション開始(simLoopへ) // + ウィンドウサイズ設定 dWorldDestroy( world ); // 世界の破壊 return 0; }
https://w.atwiki.jp/zukunashi-yarou/pages/36.html
ODEコンセプト このページでは、ODEの概念を説明します。 ODEコンセプト2つの計算エンジン ERPとCFM 衝突検出 C vs. C++ 2つの計算エンジン ODEは大きく分けて2つの計算エンジンを持ちます。 dynamics simulation engine (動力学シミュレーション・エンジン ) collision detection engine (衝突検出エンジン) 動力学シミュレーション・エンジンでは、質量、テンソル、加速度、速度といった要素を制御します。 衝突検出エンジンでは、物体の形状、衝突検出の要素を制御します。 ODEではこれら2つの計算エンジンは独立して持っています。 動力学計算と衝突計算を組み合わせるために、ODEでは明示的に関連付けを行って制御します。 関連づけを行うことで物体の位置、姿勢といったパラメータは共有化されます。 ERPとCFM 衝突検出 C vs. C++ ODEはC++で記述されていますが、ODEのAPIはシンプルなC関数で提供されています。 これは、ODEのコンセプトです。 C++ランタイムサポート問題を防ぐ ユーザはC++の特異を知らなくてもよい
https://w.atwiki.jp/opengl/pages/304.html
Open Dynamics Engine http //www.ode.org/ Open Dynamics Engine の場合は GitHub ではなく Bitbucket ですが、Visual Studio の場合は同じやり方で リポジトリをクローンできます。 (2023/9/24 現在の最新版のバージョンは 0.16.4 です。) Get the source code from BitBucket. となっている所を右クリックして、Bitbucket のリポジトリアドレスをコピーしたら いつものようにVisual Studio 2022 でリポジトリをクローンしてコンパイルするだけです。 GitHub のリポジトリをクローンしてコンパイルする方法は OpenGLプログラミングメモの別ページで新たに作りますのでそちらを参考にして下さい。 サンプルはソリューションのディレクトリ(ode)の out\build\x64-Debug にあります。 demo_basket.exe を起動してみた所です。 色々なサンプルを実行してみると、どんな事ができるのかわかりますね。 『これで、君も今日から物理プログラマーだッ!!』m9( ゚Д゚) ドーン 以下は過去記事 Open Dynamics Engine の公式ページ http //www.ode.org/ の、download ページの Get it here. をクリックします。 すると以下のページになるので最新版の ODE をダウンロードします。 http //sourceforge.net/projects/opende/files/ 2014/5/12現在、ode-0.13 が最新です。 ode-0.13.tar.bz2 (2.0 MB) をダウンロードし、解凍します。 解凍したら ode-0.13 フォルダを C \ に移動させます。 コマンドプロンプトを起動し、以下のコードをコピーアンドペーストして Enter キーで実行して下さい。 cd c \ode-0.13\build 更に、次のコードを実行します。 premake4 --with-demos --with-libccd --only-double --only-static vs2010 すると build フォルダに vs2010 というフォルダが出来ているのでその中の c \ode-0.13\build\vs2010\ode.sln を、Visual C++ 2012 Express Edition で起動します。 すると変換ウィザードが起動するので変換して下さい。 ソリューションをビルドします。 c \ode-0.13\lib\Debug に、サンプルプログラムが作成されているので色々試してみましょう。 c \ode-0.13\build\vs2010\ode.sln をDebug構成とRelease 構成でコンパイルします。 drawstuffd.libとdrawstuff.libが出来ています。 DebugDoubleDLL、DebugDoubleLib、ReleaseDoubleDLL、ReleaseDoubleLibで、 それぞれコンパイルします。 すると必要なライブラリが出来上がります。 drawstuffを使う場合は以下のようにします。(当サイトでは基本、使いませんが) Debug構成のプロジェクトのプロパティ [リンカー][追加の依存ファイル] ode_doubled.lib drawstuffd.res drawstuffd.lib opengl32.lib glu32.lib [C/C++][プリプロセッサ][プリプロセッサの定義] WIN32;_DEBUG;_LIB;dDOUBLE;%(PreprocessorDefinitions) Release構成のプロジェクトのプロパティ [リンカー][追加の依存ファイル] ode_double.lib drawstuff.res drawstuff.lib opengl32.lib glu32.lib [C/C++][プリプロセッサ][プリプロセッサの定義] WIN32;_LIB;dDOUBLE;%(PreprocessorDefinitions) _____
https://w.atwiki.jp/bambooflow/pages/31.html
ODEユーザーズガイド ODEのページのマニュアルを自分なりに翻訳してみました。 あくまで自分用なので、間違った訳しかたがあるかと思います。 注意してください。 はじめに ODEのインストールと使い方 概念 データの種類と仕様 世界 剛体関数 ジョイントの種類とジョイント関数 StepFast サポート関数 衝突検出 上手なシミュレーションの仕方? FAQ? 既知問題? ODE内部?
https://w.atwiki.jp/bambooflow/pages/33.html
2. ODEのインストールと使い方 2. ODEのインストールと使い方2.1. ODEのインストール 2.1.1. MacOS XにおけるODEの構築と実行テスト 2.2. ODEを使う 2.1. ODEのインストール Step 1 ODEアーカイブを解凍する。 Steps 2-4 (代わり) もし、windows上でMSVCを使用している場合、配給 のVC6サブディレクトリの中でワークスペースとプロジェクトのファイルを使用することができる。 Step 2 GNUのmakeツールを取得する。それはたまにgmakeと呼ばれる が、多くのUnixプラットフォームに付属する。windowsのためのGNU形のバージョンはここで利用可能である。 Step 3 ファイル上の設定を編集する。このサポートされたプラットフォームのリストはそのファイルで与えられる。 Step 4 ODEおよびグラフィカルのテストプログラムの構成(configure)と構築(build)する ためにGNU makeを実行する。 Step 5 システム上にODEライブラリをインストールするために、適切な場所へ lib/とinclude/ ディレクトリコピーするべきである。例えば、Unixの上では: include/ode/ -- /usr/local/include/ode/ lib/libode.a -- /usr/local/lib/libode.a 2.1.1. MacOS XにおけるODEの構築と実行テスト ODEはシミュレートされる画面表示のためにXウインドウとOpenGLを使っている。構築するするためにはApple X11サーバとX11SDK(または同様な標準開発ツール)が必要となる。 これらはAppleから使用可能である。これを書いている時点でこれはhttp //www.apple.com/macosx/x11で見つけることができる。注意:ページの下部の右にはSDKのために小さいリンクがある。 ソフトウェアがインストールされたら標準の構築方法に従って下さい。 ODEがX11で使うには(インストールされてアプリケーションフォルダにある)X11サーバを走らせる必要がある。 もしX11サーバがデフォルトで開くXTerm上でテストアプリを実行 するなら、快適に実行してくれる。しかしながらMacOS Xターミナルから実行するならば、DISPLAY環境変数を定義する必要がある。DISPLAYが定義されていないと、"cannot open X11 display"というメッセージが出るだろう。 テストを実行するための入力例 cd ode/test DISPLAY= 0.0 ./test_boxstack.exe スタートアップスクリプトのシェル(例えば、bashを使っているなら ば~/.bashrc)にこの環境変数を定義できる。 2.2. ODEを使う ODEを使用する方法を理解する最良の方法は、それに付属するテスト/ 例プログラムを見ることである。次のものに注意してください: ODEを使用するソースファイルは1つのヘッダファイルをインクルード必要がある: #include ode/ode.h この記述されるodeディレクトリは、実際にはODEディストリビューションの include/odeディレクトリである。このヘッダファイルはodeディレクトリに他のものもインクルードされる。したがって、コンパイラの includeパスを設定する必要がある、例えば、linuxの中で gcc -c -I /home/username/ode/include myprogram.cpp ODEでdWorldStep関数が使われる場合、一時的な値の格納のためのスタックは大外の場合活用される。非常に大規模なシステムについては、スタックの数メガバイトは使用することができる。説明されないメ モリ外エラーあるいはデータ腐敗を起こした場合、特にウインドウズ上で、スタックサイズを増加させるか、あるいはdWorldQuickStepへのスイッチングをする。
https://w.atwiki.jp/bambooflow/pages/88.html
ODEをQt上で走らせる実験 ODEをGUIで動かしたくて。。。無保証なのであしからず。 このページはメモ帳として。 目標、今のdrawstuffよりも使い易い環境。 メモ 名前 コメント すべてのコメントを見る マルチウィンドウが思いのほか簡単だったので感動。画面分割ならglViewpointを使う方法もあるみたい。 -- (管理者) 2008-02-20 22 35 45 opengl_test08.tgz ウィンドウをマルチにできた。単純にGLWidgetをコピーしただけ。 -- (管理者) 2008-02-20 22 33 05 opengl_test07.tgz 鏡になってた。修正 -- (管理者) 2008-02-19 23 05 11 スレッドは同期とらないとダメなのか? -- (管理者) 2008-02-18 23 38 12 open_test06.tgz drawstuffを改造して思いっきり利用。Cylinderも使えるようになった。ただ、シミュレーションが遅くなったときカクカクする -- (管理者) 2008-02-18 22 53 04 ↓四角い箱が落下するシミュレーション. -- (管理者) 2008-02-17 20 47 36 opengl_test05.tgz衝突を追加してみた。ただ関数へのポインタをクラスで扱えていない。 -- (管理者) 2008-02-17 20 16 05 スレッドの使いかたがよくわからない。とりあえず -- (管理者) 2008-02-16 14 41 04 opengl_test04.tgz なんとなくそれっぽい。 -- (管理者) 2008-02-16 14 40 18 odeのスレッドとGLWidget間のデータ渡しをどうしよう。odeobjectlist.hをとりあえず準備してみた。 -- (管理者) 2008-02-13 22 51 45 できればdrawstuffに頼らないものを作りたい。 -- (管理者) 2008-02-11 23 10 49 drawstuffの関数群をコピペしてまずは四角を表示。空が変だけど。。。opengl_test02.tgz -- (管理者) 2008-02-11 23 10 12 OpenGLのテスト。まずは四角表示。opengl_test01.tgz -- (管理者) 2008-02-10 11 12 07 projectファイルにthread付けるの忘れた。たぶん入れた方がよいのだろう。 -- (管理者) 2008-02-10 10 41 36 qtをスレッド化、boxが落ちる動作 thread_ode_test01.tgz -- (管理者) 2008-02-10 00 31 51 イメージ ODE s BSD license 以上
https://w.atwiki.jp/bambooflow/pages/207.html
ODEトラブル解決 ODEトラブル解決VC++EEワーニングメッセージ:「warning C4305 '引数' 'double' から 'dReal' へ切り詰めます。」と出る。 メッセージ:「stepsize must be 0 (..\..\ode\src\ode 1674)」が表示されてなぜか実行できない。 ODEの上方向はy軸?z軸? VC++EE ワーニングメッセージ:「warning C4305 引数 double から dReal へ切り詰めます。」と出る。 もし、ODEのビルドをDebugDouble**もしくはRealeaseDouble**で行っているならば、コンパイルのプロパティ設定において、 プリプロセッサの定義に"dDBOULE"を追加する必要があるかもしれません。 メッセージ:「stepsize must be 0 (..\..\ode\src\ode 1674)」が表示されてなぜか実行できない。 コンパイル時にwarning C4305が出ているならば、 プリプロセッサの定義に"dDBOULE"を追加する必要があるかもしれません。 ODEの上方向はy軸?z軸? (間違ってたらごめんなさい) ODEの座標系で上方向は特に決まっていません。 ただ、drawstuffは上方向がz軸になっているので、ODEではz軸が上方向というのが通常の考え方になっているように思います。 3Dの一般書籍ではy軸が上方向でかかれていることが多いように思いますが、この辺を押さえておかないと結構混乱します。 OpenGLや3D本で書かれている行列の計算式をそのまま使おうとしてもうまくいかないときは、yとz座標を変えて考えるとうまくいったりします。 ちなみに、drawstuffで描かれる地面のマーカーの色は、赤がx方向、青がy方向になります。 以上
https://w.atwiki.jp/bambooflow/pages/225.html
ハイトフィールド ハイトフィールドビットマップデータを高さマップとして使用 メモ(まとめ中) ハイトフィールドは、三角メッシュと似ていますが、縦横の分割数と高さのみを持つ立体形状を表現したものです。 ハイト・フィールドは非常に多くの小さな3角形によって凹凸のある面を表現します。 リアルな山や他の地形を簡単に作ることができます。 ビットマップデータを高さマップとして使用 とりあえず面白そうなので作ってみました。 32x32のビットマップファイル test_heightfield01.zip ビットマップデータは黒色は0で、白色は255となっています。 その値をそのまま高さのパラメータに使用しています。 もっとグラデーションがかった図であれば、なだらかな斜面になると思います。 一応、衝突が起こるかどうかを試すためにボールを落としています。 メモ(まとめ中) ハイトフィールドの地面を作成 dHeightfiledDataID heightid = dGeamHeightfieldDataCreate(); dGeomHeightfieldDataBuildCallback([] heightid, NULL, heightfield_callback, 4.0, // width フィールドの幅 8.0, // depth フィールドの奥行き 15, // width step size 幅方向ステップサイズ 31, // depth step size 奥行き方向ステップサイズ 1.0, // scale 0.0, // 0.0, // 0 // ); ステップサイズの値を大きくすると、heightfield_callback関数の引数の値がそのステップサイズまで変化します。 for (int x=0; x width_step; x++)みたいなイメージです。 ステップサイズを大きくすると、フィールドのグリッドが細かくなります。 細かくしすぎると、処理が重くなりますので注意してください。 ODEのdemoについているdemo_heightfieldが参考になると思います。 demoの場合、ステップサイズを大きくしすぎるとグラフィック処理がかなりつらくなります。 この場合は、リストを使って表示したほうがよさそうです。 ハイトフィールドの表示は、drawstuffでは、ステップサイズの大きさに限界がありそう。